import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken, removeToken } from '@/utils/auth'
import router from '@/router';
import SettingEnv from '@/setting.env'

// 创建axios实例
const service = axios.create({
  // axios请求配置有baseURL
  baseURL: SettingEnv.apiBaseURL,
  headers: {
    /**
     * 有三种情况：
     * 1、不是GET请求时，返回的是404(用于其他请求时，返回reject)
     * 2、是GET请求时，返回的是404(用于分页，此时需要返回一个空数组reslove)
     * 3、是GET请求时，返回的是404(用于发送GET请求，但要返回一个reject)
     * 当第三种情况时isReject = false
     */
    isReject: true
  },
  // 超时时间
  timeout: SettingEnv.apiBaseTime
})

// request请求拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) config.headers['Authorization'] = 'bearer ' + getToken()
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    if (response.headers['x-pagination']) {
      return {
        data: response.data,
        head: JSON.parse(response.headers['x-pagination'])
      }
    }
    return response.data
  },
  error => {
    let isMessage = false,
        type = 'error';
    switch (error.response.status) {
      case 401:
        error.message = '无效的会话，或者登录已过期，请重新登录';
        removeToken();
        router.replace({ path: `${store.getters.customRouter}/login` });
        break
      case 403:
        isMessage = true;
        error.message = '没有权限访问';
        break
      case 422:
        error.message = error.response.data.errors[Object.keys(error.response.data.errors)[0]][0];
        type = 'warning';
        break
      case 404:
        if (error.response.config.method === 'get' && error.response.config.headers.isReject) type = 'warning'
        error.message = error.response.data
        break
      case 400:
        error.message = error.response.data
        break
    };

    if (error.response.config.method.toUpperCase() === 'GET' && error.response.config.params && error.response.config.params.isGet) return Promise.reject(error);
    else if (!isMessage) {
      Message({
        message: error.message,
        type: type,
        duration: 5 * 1000
      });
    };
    return Promise.reject(error);
  }
)

export default service
